home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- MODULE: rgets.c
- PURPOSE: recio character delimited string and char input functions
- COPYRIGHT: (C) 1994 William Pierpoint
- COMPILER: Borland C Version 3.1
- OS: MSDOS Version 6.2
- VERSION: 2.00
- RELEASE: April 15, 1994
- *****************************************************************************/
-
- #include <ctype.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "recio.h"
-
- extern int _rstatus(REC *rp, int mode);
- extern char *_rfldstr(REC *rp, size_t len);
- extern char *_rerrs(REC *rp, int errnum);
-
- #define rflags(rp) ((rp)->r_flags)
- #define rcol(rp) ((rp)->r_colno)
- #define rreclen(rp) ((rp)->r_reclen)
-
- /****************************************************************************/
- int /* return character; EOF=error or missing data */
- str2c( /* convert string to character */
- const char *nptr, /* pointer to string to convert */
- char **endptr) /* pointer to conversion leftover string */
- /****************************************************************************/
- {
- int ch=EOF; /* result to return */
-
- errno = 0;
-
- /* set *endptr to nptr just in case conversion fails */
- if (endptr) *endptr = (char *) nptr;
-
- /* skip over white space */
- while (isspace(*nptr)) nptr++;
-
- /* if string contains a non-whitespace character */
- if (*nptr != '\0') {
-
- /* get the character */
- ch = (int) *nptr;
-
- /* position endptr just past the character */
- if (endptr) *endptr = (char *) ++nptr;
- }
- return (ch);
- }
-
- /****************************************************************************/
- int /* return pointer to char; EOF on error */
- rgetc( /* get character from record stream */
- REC *rp) /* record pointer */
- /****************************************************************************/
- {
- int result=(EOF); /* character to return */
- int ch; /* conversion character */
- char *fldptr; /* pointer to field string */
- char *endptr; /* pointer to first invalid field char */
-
- if (!_rstatus(rp, R_READ)) {
- fldptr = _rfldstr(rp, 0);
- if (fldptr) {
- for (;;) {
- if (*fldptr != '\0') {
- endptr = fldptr;
- ch = str2c(fldptr, &endptr);
- while (isspace(*endptr)) endptr++;
- if (!*endptr) {
- result = ch;
- break;
- } /* invalid data */
- fldptr = _rerrs(rp, R_EINVDAT);
- if (fldptr) continue;
- } /* missing data */
- fldptr = _rerrs(rp, R_EMISDAT);
- if (fldptr) continue;
- break;
- }
- } /* null pointer */
- }
- return result;
- }
-
- /****************************************************************************/
- char * /* return pointer to string; "" on error */
- rgets( /* get string from record stream */
- REC *rp) /* record pointer */
- /****************************************************************************/
- {
- static char empty[]=""; /* empty string */
- char *retp=empty; /* return pointer */
- char *fldp; /* pointer to field buffer */
-
- if (!_rstatus(rp, R_READ)) {
-
- /* if field position is within record */
- if (rcol(rp) <= rreclen(rp)) {
- fldp = _rfldstr(rp, 0);
- if (fldp) {
- /* if str empty */
- if (!*fldp) {
- rsetwarn(rp, R_WEMPSTR);
- retp = rflds(rp);
- } else {
- retp = fldp;
- }
- }
-
- /* else beyond end of record */
- } else {
- rfldno(rp)++;
- rsetfldstr(rp, "");
- rsetwarn(rp, R_WEMPSTR);
- retp = rflds(rp);
- }
- }
- return (retp);
- }
-